python处理shp数据以及地理/投影坐标的转换

您所在的位置:网站首页 pyproj 坐标转换 python处理shp数据以及地理/投影坐标的转换

python处理shp数据以及地理/投影坐标的转换

2022-03-24 02:32| 来源: 网络整理| 查看: 265

shp数据读取

Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性。Shapefile文件用于描述几何体对象:点,折线与多边形。例如,Shapefile文件可以存储井、河流、湖泊等空间对象的几何位置。除了几何位置,shp文件也可以存储这些空间对象的属性,例如一条河流的名字,一个城市的温度等等。 本次处理shp数据需要使用到pyshp这一模块。其安装可以在cmd上使用pip进行安装。cd到blender中的python路径下面,使用python -m pip install pyshp这一语句安装。 在这里插入图片描述 在使用时,可以使用如下代码查看内容:

import shapefile # 使用pyshp file = shapefile.Reader("D://2019全国行政区划//省.shp") print(file.fields)# 输出所有字段信息 print(file.record(0)[0])#第一个对象的第一个属性值

而file本身还有很多属性,在blender的控制台利用自动补全功能可以很方便地获得展开解读,这也是我平时比较常用的功能。在2.83版本中取消了快捷键ctrl+alt+space快捷键,虽然可以设置快捷键,但是体验不是很好。

以点为例读取坐标及属性值

首先,我们需要弄清在arcgis中物体的存储规则。无论是点线面,其数据都是由点组成的,面也就是首尾相连的有序线段,线段则就是两个点。使用shapes()方法可以获取shp文件中的物体集合,而使用面就可以很好地理解。

polygons = file.shapes()#一个shp由多个多边形组成 polygon_point=polygons[0].points#第一个多边形的点集 point=polygon_point[0]#该点集中的第一个点 x=p[0] y=p[1]

上述虽然是多边形的结构,但是同样适用于线和点。如果为点shp,那么一个点就是一个多边形,也就意味着第一行代码的每一个多边形其实是一个点,且第二行只能获取一个点。

地理坐标与投影坐标的转换 pyproj

首先需要使用pip安装pyproj。说再多不如贴两行代码好懂。关于epsg可以在 地理坐标系:https://developers.arcgis.com/javascript/3/jshelp/gcs.htm 投影坐标系:https://developers.arcgis.com/javascript/3/jshelp/pcs.htm

from pyproj import CRS from pyproj import Transformer crs_WGS84 = CRS.from_epsg(4326) # WGS84地理坐标系 crs_WebMercator = CRS.from_epsg(3857) # Web墨卡托投影坐标系 def coordination_convert1(proj1): transformer = Transformer.from_crs(crs_WGS84, crs_WebMercator, always_xy=True) proj2 = transformer.transform(proj1[0],proj1[1]) return proj2#一个二维向量

值得注意的是现在很多方法的输入值的顺序由(经度,纬度)改为了(纬度,经度)如果输出结果出现inf,就要回头看看是不是弄反了。 然而pyproj这个库会与blendergis这个插件发生冲突,即"Proj has no attribute is_latlong"。因此如果你在使用blendergis这个插件,导入basemap时会报错,甚至blender会直接闪退,所以需要另觅他法。 https://gitmemory.com/issue/domlysz/BlenderGIS/197/536708330 在这里插入图片描述

GDAL

本次以矢量坐标为例,需要用到osr,而osr包含在了gdal中。gdal并不能通过pip直接下载,需要实现安装whl文件。https://blog.csdn.net/dugushangliang/article/details/96891361 这篇文章详细地讲解了如何安装gdal,并且附带有下载链接。

import osgeo.osr as osr#使用gdal方法 def point_transform(source_ref,target_ref,x,y): #创建目标空间参考 spatialref_target=osr.SpatialReference() spatialref_target.ImportFromEPSG(target_ref)#转换坐标 #创建原始空间参考 spatialref_source=osr.SpatialReference() spatialref_source.ImportFromEPSG(source_ref) #原始坐标 #构建坐标转换对象,用以转换不同空间参考下的坐标 trans=osr.CoordinateTransformation(spatialref_source,spatialref_target) coordinate_after_trans=trans.TransformPoint(x,y) return coordinate_after_trans#一个二维向量 v=point_transform(4326,3857,lat,lon)

本文参考: 【1】https://blog.csdn.net/sinat_28797501/article/details/75635439 【2】https://blog.csdn.net/dugushangliang/article/details/96891361



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3